package enterprise.manage.util;

import junit.framework.TestCase;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * Created by IntelliJ IDEA.
 * User: zhenmingyue
 * Date: 2010-8-12
 * Time: 15:40:20
 * Desc:日期工具类
 */
public class TimeUtils {
    private final static Logger LOGGER = Logger.getLogger(TimeUtils.class);

    /**
     * 得到日间隔（通过传入参数）
     *
     * @param interval 时间间隔
     * @return 开始时间
     */
    public static String getTimeOfInterval(String interval) {
        return getTimeOfInterval(interval, 0);
    }

    public static String getTimeOfInterval(String interval, int type) {
        Calendar validityTime = Calendar.getInstance();
        if (StringUtils.isNotBlank(interval)) {
            if (type == Calendar.MONTH) {
                validityTime.add(Calendar.MONTH, Integer.valueOf(interval));
            } else if (type == Calendar.YEAR) {
                validityTime.add(Calendar.YEAR, Integer.valueOf(interval));
            } else {
                validityTime.add(Calendar.DATE, Integer.valueOf(interval));
            }
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(validityTime.getTime());
    }

    public static String getTimeOfInterval(String strTime, String interval, int type) throws ParseException {
        Calendar validityTime = Calendar.getInstance();
        if (StringUtils.isNotBlank(strTime)) {
            validityTime = dateToCalendar(getDate(strTime));
        } else {
            validityTime = Calendar.getInstance();
        }
        if (StringUtils.isNotBlank(interval)) {
            if (type == Calendar.MONTH) {
                validityTime.add(Calendar.MONTH, Integer.valueOf(interval));
            } else if (type == Calendar.YEAR) {
                validityTime.add(Calendar.YEAR, Integer.valueOf(interval));
            } else {
                validityTime.add(Calendar.DATE, Integer.valueOf(interval));
            }
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(validityTime.getTime());
    }

    /**
     * 默认获得日期字符串
     *
     * @param strTime 日期字符串
     * @return 对字符串验证，默认返回当前日期
     * @throws java.text.ParseException
     */
    public static String getTimeString(String strTime) throws ParseException {
        return getTimeString(strTime, "");
    }

    /**
     * 默认获得日期字符串
     *
     * @param strTime  日期字符串
     * @param interval 日期间隔    （间隔类型如 Calendar.DATE)
     * @return 对字符串验证，默认返回当前日期
     * @throws java.text.ParseException
     */
    public static String getTimeString(String strTime, String interval) throws ParseException {
        return getTimeString(strTime, interval, Calendar.DATE);
    }

    public static String getTimeString(String strTime, String interval, int intervalType) throws ParseException {
        return getTimeString(strTime, interval, intervalType, "");
    }

    public static String getTimeString(String strTime, String interval, int intervalType, String suffix) throws ParseException {
        if (StringUtils.isNotBlank(suffix)) {
            Calendar validityTime = Calendar.getInstance();
            strTime = new SimpleDateFormat("yyyy-MM-dd").format(validityTime.getTime()) + suffix;
        }
        strTime = getTimeOfInterval(strTime, interval, intervalType);

        return strTime;
    }


    public static Date getDate(String strTime) throws ParseException {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strTime);
    }

    public static Calendar dateToCalendar(Date date) throws ParseException {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        return calendar;
    }

    public static Date getDate(String strTime, String interval) throws ParseException {
        String dateTimeStr = getTimeString(strTime, interval);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strTime);
    }


    public static Date getDate(String strTime, String interval, int intervalType) throws ParseException {
        String dateTimeStr = getTimeString(strTime, interval, intervalType);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strTime);
    }

    /**
     * 获取指定日期的calendar对象
     *
     * @param strTime 日期（默认空字符串时为当前日期）
     * @return 指定日期calendar 对象
     * @throws java.text.ParseException
     */
    public static Calendar getCalendar(String strTime) throws ParseException {
        return getCalendar(strTime, "");
    }

    /**
     * 获取 （指定日期，指定时间间隔） 的calendar对象
     *
     * @param strTime  获得指定日期
     * @param interval 间隔（默认为 间隔类型如 Calendar.DATE)
     * @return 指定日期calendar 对象
     * @throws java.text.ParseException
     */
    public static Calendar getCalendar(String strTime, String interval) throws ParseException {
        return getCalendar(strTime, interval, 0);
    }

    /**
     * 获取 （指定日期，指定时间间隔，间隔类型） 的calendar对象
     *
     * @param strTime      获得指定日期
     * @param interval     间隔（默认为 天 类型）
     * @param intervalType 间隔类型    （默认 Calendar.DATE)
     * @return calendar 对象
     * @throws java.text.ParseException
     */
    public static Calendar getCalendar(String strTime, String interval, int intervalType) throws ParseException {
        return getCalendar(strTime, interval, intervalType, "");
    }

    /**
     * 获取 （指定日期，指定时间间隔，前缀） 的calendar对象
     *
     * @param strTime  获得指定日期
     * @param interval 间隔（默认为  Calendar.DATE)
     * @param suffix   指定日期后缀（如 0:0:00.000）
     * @return calendar 对象
     * @throws java.text.ParseException
     */
    public static Calendar getCalendar(String strTime, String interval, String suffix) throws ParseException {
        return getCalendar(strTime, interval, 0, suffix);
    }

    /**
     * 获取 （指定日期，指定时间间隔，间隔类型，前缀） 的calendar对象
     *
     * @param strTime      获得指定日期
     * @param interval     间隔（默认 Calendar.DATE)
     * @param intervalType 间隔类型    默认为天
     * @param suffix       指定日期后缀（如 0:0:0.000）
     * @return calendar 对象
     * @throws java.text.ParseException
     */
    public static Calendar getCalendar(String strTime, String interval, int intervalType, String suffix) throws ParseException {
        String dateTimeStr;
        dateTimeStr = getTimeString(strTime, interval, intervalType, suffix);
        Date date = getDate(dateTimeStr);
        return dateToCalendar(date);
    }
    public static String getDateString(Calendar calendar){
             return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()) ;
    }

    /**
     * 获取当前月 日期时间
     *
     * @return calendar 对象
     * @throws java.text.ParseException
     */
    public static Calendar getCurrentMonth() throws ParseException {
        Calendar validityTime = Calendar.getInstance();
        String dateTimeStr = new SimpleDateFormat("yyyy-MM").format(validityTime.getTime()) + "-1 0:0:0";
        Date date = getDate(dateTimeStr);
        return dateToCalendar(date);
    }

    public void test() {
// <option value="TODAY">当天</option>
//                <option value="WEEK">最近一周</option>
//                <option value="MONTH">本月</option>
//                <option value="ONEMONTH">最近一月</option>
//                <option value="THREEMONTH">最近三个月</option>
//                <option value="HALFYEAR">最近半年</option>
//                <option value="YEAR">最近一年</option>
        try {

            LOGGER.info(getCalendar("2010-01-01 1:1:1 222").getTime());

            LOGGER.info(getCalendar("2010-01-03 1:1:1 222","-2",Calendar.YEAR).getTime());
            LOGGER.info(getCalendar("").getTime());
            LOGGER.info(getCalendar("","",0," 0:0:0").getTime());
            LOGGER.info(getCalendar("","1",0," 0:0:0").getTime());
//            LOGGER.info(getCalendar("","-7").getTime());
//            LOGGER.info(getCurrentMonth().getTime());
//            LOGGER.info(getCalendar("","-1",Calendar.MONTH).getTime());
//            LOGGER.info(getCalendar("","-3",Calendar.MONTH).getTime());
//            LOGGER.info(getCalendar("","-6",Calendar.MONTH).getTime());
//            LOGGER.info(getCalendar("","-1",Calendar.YEAR).getTime());
        } catch (ParseException e) {
            e.getMessage();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}